package cn.springcloud.fix.demo.io;

import java.io.IOException;

public class Test {

    //    三种模型都是这样
    //    Reactor  SubReactor  ：把IO事件分配给对应的handler处理    主从Reactor  为什么一主一从
    //    Acceptor：处理客户端连接事件
    //    Handler HandlerState ReadState WriteState WorkState ：处理非阻塞的任务

    //  第一个good： 当Acceptor处理连接事件后，主reactor将连接分配给从Reactor  good
    //  从Reactor将连接加入到连接队列进行监听，并创建handler进行各种事件处理
    //  当有新事件发生时，从reactor就会对用对应的handler处理
    //  handler读取数据后，分发给后面的worker线程处理
    //   worker线程池分配独立的worker线程进行处理并返回结果
    //  handler收到结果后再讲结果返回给客户端

    // 第二个good   mainReactor只处理连接事件，读写事件交给subReactor来处理。   懂了
    // 业务逻辑还是由线程池来处理，mainRactor只处理连接事件，用一个线程来处理就好。
    // 处理读写事件的subReactor个数一般和CPU数量相等，一个subReactor对应一个线程，业务逻辑由线程池处理

    public static void main(String[] args) {
        try {
            Reactor reactor = new Reactor(1333);   // 这里新建一个TCPReactor，新建一个Acceptor，新建8个TCPSubReactor并子线程运行，
            // 所以对于8个TCPSubReactor，都会阻塞在run()中的   if (selector.select() == 0) 中的一句
            // 但是只是8个子线程的阻塞(所以这就是Acceptor类中新建8个TCPSubReactor类使用start()运行的原因，
            // 因为其run()中的selector.select()一定会阻塞，不要阻塞main线程)  main线程可以继续执行，看下面
            Thread thread = new Thread(reactor);
            thread.start();  //  为什么这里需要TCPReactor.start(),为什么不在main线程中执行
            // 表示新建子线程执行TCPReactor中的run()方法，但是TCPReactor的run()方法没有synchronized，
            // 第一start 第一个synchronized  就是因为start才需要synchronized
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
